package main

import (
	"fmt"
	"sync"
)

func main() {
	//demo01()
	//demo02()
	demo03()
}

func demo01() {
	//回顾：make创建信道的时候，若不传入第二个参数，则你定义的是无缓冲信道，而对于无缓存信道，在接收者没有准备好之前，发送操作是阻塞的
	//因此，对于解决此问题有两种方法:
	// 1.使接收者代码在发送者之前执行
	// 2.使用缓冲信道，而不使用无缓存信道
	pipline := make(chan string)
	var wg sync.WaitGroup
	wg.Add(1)
	go func(pipline chan string, wg *sync.WaitGroup) {
		defer wg.Done()
		a := <-pipline
		fmt.Println(a)
	}(pipline, &wg)
	pipline <- "hello world"
	wg.Wait()
	//fmt.Println(<-pipline)
}

func demo02() {
	// 每个缓冲信道，都有容量，当信道的数据等于信道的容量后，此时再往信道里发送数据，就会造成阻塞，必须等到有人从信道中消费数据后，程序才会往下执行
	ch1 := make(chan string, 1)
	ch1 <- "hello world"
	//ch1 <- "hello world"
	fmt.Println(<-ch1)
}

func demo03() {
	pipline := make(chan string)
	go func() {
		pipline <- "hello world"
		pipline <- "hello China"
		close(pipline) //发送完数据，关闭信道
	}()
	for data := range pipline {
		fmt.Println(data)
	}
}

/**
总结:
	1.无缓冲信道，需要先启动接收协程，才能发送数据
	2.信道超过容量，继续放入数据，会阻塞
	3.信道长度为0，继续从信道中取数据，也会阻塞；衍生出发送完数据要记得关闭信道close(pipline)

*/
